package io.renren.common.export;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;

import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;

/**
 * word工具类
 */
public class WordUtils {
    /**
     * 根据模板引擎生成Word文件
     *
     * @param dataMap      待填充数据
     * @param templateName 模板文件名称
     * @param filePath     模板文件路径
     * @param fileName     生成的Word文件名称
     * @param response     响应流
     */
    public static void createWord(Map dataMap, String templateName, String filePath, String fileName, HttpServletResponse response) {
        try {
            response.setHeader("content-Type", "application/msword");

            // 创建配置实例
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
            // Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
            // 设置编码
            configuration.setDefaultEncoding(StandardCharsets.UTF_8.name());
            // ftl模板文件
            configuration.setClassForTemplateLoading(WordUtils.class, filePath);
            //设置对象包装器
            configuration.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_28));
            //configuration.setObjectWrapper(new DefaultObjectWrapper(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS));
            //设置异常处理器
            configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
            // 获取模板
            Template template = configuration.getTemplate(templateName);

            try {
                // 定义输出类型
                response.setContentType("application/octet-stream");
                // 下载文件的默认名称
                response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".doc", StandardCharsets.UTF_8.name()));
                //处理乱码问题
                response.setCharacterEncoding("utf-8");
                //生成Word文档
                template.process(dataMap, response.getWriter());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                response.flushBuffer();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
